www.gusucode.com > DB-Libray 操作SQLServer编程的VC++ 一例-源码程序 > DB-Libray 操作SQLServer编程的VC++ 一例-源码程序\code\PhManage\SaleView.cpp

    //Download by http://www.NewXing.com
// SaleView.cpp : implementation file
//

#include "stdafx.h"
#include "PhysicM.h"
#include "SaleView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSaleView

IMPLEMENT_DYNCREATE(CSaleView, CFormView)

CSaleView::CSaleView()
	: CFormView(CSaleView::IDD)
{
	//{{AFX_DATA_INIT(CSaleView)
	m_price = 0.0;
	m_rate = 0.0;
	m_number = 0.0;
	m_edt = _T("");
	m_dt_rate = 0.0;
	//}}AFX_DATA_INIT
	//ImageList=NULL;
	init=false;
}

CSaleView::~CSaleView()
{
//	if (ImageList) delete ImageList;
}

void CSaleView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSaleView)
	DDX_Control(pDX, IDC_SALESMAN_COMB, m_SaleManComb);
	DDX_Control(pDX, IDC_HOSPITAL_COMB, m_HospitalComb);
	DDX_Control(pDX, IDC_PhysicName_COMB, m_PhysicComb);
	DDX_Control(pDX, IDC_PROVIDER_COMB, m_ProviderComb);
	DDX_Text(pDX, IDC_PRICE_EDIT, m_price);
	DDX_Text(pDX, IDC_RATE_EDIT, m_rate);
	DDX_Control(pDX, IDC_MSFLEXGRID1, m_Grid);
	DDX_Text(pDX, IDC_EDT, m_edt);
	DDX_Text(pDX, IDC_DEDIT, m_dt_rate);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSaleView, CFormView)
	//{{AFX_MSG_MAP(CSaleView)
	ON_CBN_SELCHANGE(IDC_PhysicName_COMB, OnSelchange)
	ON_CBN_SELCHANGE(IDC_PROVIDER_COMB, OnSelchangeProviderComb)
	ON_BN_CLICKED(IDC_ADD_BTN, OnAddBtn)
	ON_CBN_SELCHANGE(IDC_HOSPITAL_COMB, OnSelchangeHospitalComb)
	ON_EN_CHANGE(IDC_EDT, OnChangeEdt)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSaleView diagnostics

#ifdef _DEBUG
void CSaleView::AssertValid() const
{
	CFormView::AssertValid();
}

void CSaleView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSaleView message handlers

void CSaleView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	if (init) return;
	/*
	m_List.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
	char *head[]={"序 号","药品名称","单价","数量","金额","费率(%)","费用","医生","医生费率%","医生费用","供应商名称","医院","销售员","ID","备注"};
	int i;
	
	for (i=0;i<7;i++)
		m_List.InsertColumn(i,head[i],(i>1)?LVCFMT_RIGHT:LVCFMT_LEFT,(i==1) ? 100 : 55,i);
	for (i=7;i<9;i++)
		m_List.InsertColumn(i,head[i],(i>7)?LVCFMT_RIGHT:LVCFMT_LEFT,70,i);
	for (i=9;i<15;i++)
		m_List.InsertColumn(i,head[i],LVCFMT_LEFT,(i>9 && i<12) ? 150 :70);
	ImageList=new CImageList();
	ImageList->Create(16,16,TRUE | ILC_COLOR32,2,0);
	ImageList->Add(AfxGetApp()->LoadIcon(IDI_ICONUSER));
	ImageList->Add(AfxGetApp()->LoadIcon(IDR_MENUVIEW_TMPL));
	m_List.SetImageList(ImageList,LVSIL_SMALL);// LVSIL_NORMAL);
	*/
	Init();
	DefineGrid();

}
void CSaleView::Init()
{
	init=true;
	try{
		DBLibrary DB(GetDB());
		DB.Open("select a.physic_id phid,"
			"b.physic_name phn "
			" from physic_rate a,physic b"
			" where a.physic_id=b.physic_id "
			" order by a.physic_id");
		int id=0;
		char pn[40],tmp[50];
		memset(tmp,0,50);
		memset(pn,0,40);
		while(!DB.isEof())
		{
			id=DB.GetValue("phid");
			DB.GetValue("phn",pn);
			sprintf(tmp,"[%03d]%s",id,pn);
			m_PhysicComb.AddString(tmp);
			DB.Next();
		}
		/*
		DB.Open("select hospital_id hid,rtrim(hospital_name) hn from hospital order by hospital_id");
		memset(tmp,0,50);
		memset(pn,0,40);
		while(!DB.isEof())
		{
			id=DB.GetValue("hid");
			DB.GetValue("hn",pn);
			sprintf(tmp,"[%03d]%s",id,pn);
			m_HospitalComb.AddString(tmp);
			DB.Next();
		}
		*/
		DB.Open("select salesman_id sid,salesman_name sn from salesman order by salesman_id");
		memset(tmp,0,50);
		memset(pn,0,40);
		while(!DB.isEof())
		{
			id=DB.GetValue("sid");
			DB.GetValue("sn",pn);
			sprintf(tmp,"[%03d]%s",id,pn);
			m_SaleManComb.AddString(tmp);
			DB.Next();
		}
		/*
		DB.Open("select doctor_id did,doctor_name dn from doctor order by doctor_id");
		memset(tmp,0,50);
		memset(pn,0,40);
		while(!DB.isEof())
		{
			id=DB.GetValue("did");
			DB.GetValue("dn",pn);
			sprintf(tmp,"[%03d]%s",id,pn);
			m_DoctorComb.AddString(tmp);
			DB.Next();
		}
*/
	}catch (DBErr &err)
	{
		char *str;
		int code;
		err.GetLastErr(code,&str);
		//((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("%s(%d)",str,code);
		ShowErr(str,code);
	}
	catch (...)
	{
		ShowErr("unknow error",-1);
		//((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("unknow err(%d)",-1);
	}

	
}

void CSaleView::OnSelchange() 
{

	m_Grid.SetRows(2);
	for(int i=0;i<m_Grid.GetCols() - 1;i++)
		m_Grid.SetTextMatrix(1,i,"");
	GetDlgItem(IDC_EDT)->ShowWindow(SW_HIDE);
	m_price=0;m_dt_rate=0;m_rate=0;
	
	UpdateData(FALSE);
	m_HospitalComb.ResetContent();
	m_ProviderComb.ResetContent();

	CString pn;
	m_PhysicComb.GetWindowText(pn);
	if(pn.IsEmpty()) return;
	CString pid=pn.Mid(1,3);
	
	DBLibrary DB(((CPhysicMApp *)AfxGetApp())->DBSession);
	try{
		DB.Open("select a.provider_id prid,"
			"b.provider_name pn "
			" from physic_rate a,provider b"
			" where a.physic_id=%s and a.provider_id=b.provider_id "
			" order by a.provider_id",pid);
		int id=0;
		char pn[40],tmp[50];
		memset(tmp,0,50);
		memset(pn,0,40);
		while(!DB.isEof())
		{
			id=DB.GetValue("prid");
			DB.GetValue("pn",pn);
			sprintf(tmp,"[%03d]%s",id,pn);
			m_ProviderComb.AddString(tmp);
			DB.Next();
		}
	}catch (DBErr &err)
	{
		char *str;
		int code;
		err.GetLastErr(code,&str);
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("%s(%d)",str,code);
	}
	catch (...)
	{
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("unknow err(%d)",-1);
	}
	
}

void CSaleView::OnSelchangeProviderComb() 
{
	m_Grid.SetRows(2);
	for(int i=0;i<m_Grid.GetCols() - 1;i++)
		m_Grid.SetTextMatrix(1,i,"");
	GetDlgItem(IDC_EDT)->ShowWindow(SW_HIDE);
	CString pn,pr;
	m_PhysicComb.GetWindowText(pn);
	m_ProviderComb.GetWindowText(pr);
	if(pn.IsEmpty()) return;
	if(pr.IsEmpty()) return;

	CString pid,prid;
	pid=pn.Mid(1,3);
	prid=pr.Mid(1,3);
	
	DBLibrary DB(((CPhysicMApp *)AfxGetApp())->DBSession);
	try{
		DB.Open("select a.physic_id phid,"
			"b.physic_name phn,"
			" b.price,a.rate,a.doctor_rate"
			" from physic_rate a,physic b "
			" where a.physic_id=%s and a.provider_id=%s "
			" and a.physic_id=b.physic_id "
			" order by a.physic_id",pid,prid);
/*		double price,rate,d_rate;
		pric=0.00;
		rate=0.00;
		d_rate=0.00;
		*/
		DB.GetValue("price",&m_price);
		DB.GetValue("rate",&m_rate);
		DB.GetValue("doctor_rate",&m_dt_rate);
		//m_price=price
		UpdateData(FALSE);
		GetHospital();
	}catch (DBErr &err)
	{
		char *str;
		int code;
		err.GetLastErr(code,&str);
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("%s(%d)",str,code);
	}
	catch (...)
	{
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("unknow err(%d)",-1);
	}
}

void CSaleView::OnAddBtn() 
{
	DBLibrary DB(((CPhysicMApp *)AfxGetApp())->DBSession);
	UpdateData();
	GetDlgItem(IDC_ADD_BTN)->EnableWindow(FALSE);
	CString pt,ht,st,prt,dt;
	CString pid,hid,sid,prid,did;
	CString num,price,sub_fee,real_fee,date,dt_rate;

	//double num=0.00,
	m_PhysicComb.GetWindowText(pt);
	m_HospitalComb.GetWindowText(ht);
	m_SaleManComb.GetWindowText(st);
	m_ProviderComb.GetWindowText(prt);
	
	pt.TrimLeft();
	pt.TrimRight();
	ht.TrimLeft();
	ht.TrimRight();
	st.TrimLeft();
	st.TrimRight();
	prt.TrimLeft();
	prt.TrimRight();
	try
	{
		if(m_dt_rate<=0) 
		{
			int rt=MessageBox("临床费为零或小于零,是否继续?","提示信息",MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2);
			if (rt != IDYES) throw "临床费为零或小于零,取消操作";
		}

		if(pt.IsEmpty())
			throw "药品名称不能为空,请选择";
		
		if(ht.IsEmpty())
			throw "医院名称不能为空,请选择";
		if(st.IsEmpty())
			throw "销售人员名称不能为空,请选择";
			
		if(prt.IsEmpty())
			throw "供应商名称不能为空,请选择";
	}catch(char *estr)
	{
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr(estr);
		GetDlgItem(IDC_ADD_BTN)->EnableWindow(TRUE);
		GetDlgItem(IDC_DEDIT)->SetFocus();
		DB.RollbackTrans();
		return;
	}
	
	pid=pt.Mid(1,3);
	hid=ht.Mid(1,3);
	sid=st.Mid(1,3);
	prid=prt.Mid(1,3);
	//did=dt.Mid(1,3);
	
//	DBLibrary DB(((CPhysicMApp *)AfxGetApp())->DBSession);
	/*
	if (!CheckGrid(&m_Grid)) {
		GetDlgItem(IDC_ADD_BTN)->EnableWindow(TRUE);
		return;
	}
	*/
	double max_id=0;
	char errstr[100];
	try{
		DB.Open("SELECT IDENT_CURRENT('SALE_NUMBER') did "
			" FROM INFORMATION_SCHEMA.TABLES "
			" WHERE TABLE_NAME ='SALE_NUMBER' ");
		DB.GetValue("did",&max_id);
		max_id += 1;
		int id=(int)max_id;
		int rt=0,ct=0,rows,count=0;
		rows=m_Grid.GetRows();
		rows -= 1;
		DB.BeginTrans();
		for (rt=1;rt<rows;rt++)
		{
			dt=m_Grid.GetTextMatrix(rt,1);
			did=dt.Mid(1,3);
			did.TrimLeft();
			did.TrimRight();
			num=m_Grid.GetTextMatrix(rt,2);
			dt_rate=m_Grid.GetTextMatrix(rt,3);
			price=m_Grid.GetTextMatrix(rt,4);
			sub_fee=m_Grid.GetTextMatrix(rt,5);
			real_fee=m_Grid.GetTextMatrix(rt,6);
			date=m_Grid.GetTextMatrix(rt,7);
			num.TrimLeft();
			num.TrimRight();			
			if (atof(num) <= 0.00)	continue;
		
			price.TrimLeft();
			price.TrimRight();
			if (price.IsEmpty()) price="0";
			sub_fee.TrimLeft();
			sub_fee.TrimRight();
			if (sub_fee.IsEmpty()) sub_fee="0";
			date.TrimLeft();
			date.TrimRight();
			
			if (date.IsEmpty()) 
			{
				sprintf(errstr,"销售日期不能为空(第%d行),请输入",rt);
				throw errstr;
			}
			if(date.GetLength() != 10)
			{
				sprintf(errstr,"销售日期有误(第%d行),请检查",rt);
				throw errstr;
			}
			int year,month,day;
			year=atoi(date.Mid(0,4));
			month=atoi(date.Mid(5,2));
			day=atoi(date.Mid(8,2));
			COleDateTime dt;
			if (dt.SetDate(year,month,day) != 0) 
			{
				sprintf(errstr,"销售日期%s有误(第%d行),请更正",date,rt);
				throw errstr;
			}
			date=dt.Format("%Y-%m-%d");    
			if (did.IsEmpty()) {
				sprintf(errstr,"第%d行医生编号有误",rt);
				throw errstr;
			}
			
			DB.ExecSQL("INSERT INTO sale_number "
				"(Physic_ID,Hospital_ID,Salesman_ID,Provider_ID,doctor_id,Physic_Num,price,Rate,doctor_rate,sum_fee,Sub_Fee,real_fee,Sale_Date,Op_Date) "
				" VALUES(%s,%s,%s,%s,%s,%s,%.2f,%.2f,%s,%s,%s,%s,'%s',GetDate())",//
				pid,hid,sid,prid,did,num,m_price,m_rate,dt_rate,price,sub_fee,real_fee,date);//
			count++;
		}
		if (count == 0) throw "没有内容需要增加";

		DB.CommitTrans();
		
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddLog("新增销售记录%d条成功",count);
		GetDlgItem(IDC_ADD_BTN)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDT)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_DEDIT)->SetFocus();
		m_edt="";
		UpdateData(FALSE);
		for(int row=1; row<m_Grid.GetRows();row++)
			for(int cols=2;cols<m_Grid.GetCols();cols++)
			{
				if (cols==3) continue;
				m_Grid.SetTextMatrix(row,cols,"");
			}

	}
	catch (DBErr &err)
	{
		char *str;
		int code;
		err.GetLastErr(code,&str);
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("%s(%d)",str,code);
		DB.RollbackTrans();
		GetDlgItem(IDC_ADD_BTN)->EnableWindow(TRUE);
	}
	catch (char *estr)
	{
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr(estr);
		DB.RollbackTrans();
		GetDlgItem(IDC_ADD_BTN)->EnableWindow(TRUE);
	}
	catch(...)
	{
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("unknow err(%d)",-1);
		DB.RollbackTrans();
		GetDlgItem(IDC_ADD_BTN)->EnableWindow(TRUE);
	}	

}
void CSaleView::DefineGrid()
{
	int i,rows=8;
	m_Grid.SetCols(rows);
	m_Grid.SetRows(2);
	m_Grid.SetFixedCols(2);
	m_Grid.SetFixedRows(1);
	m_Grid.SetRowHeight(0,400);
	m_Grid.SetRowHeight(1,320);
	for (i=1;i<m_Grid.GetRows() -1;i++)
		m_Grid.SetRowHeight(i,320);
	int row=0;
	char *head[]={"序号","医   生","数  量 ","临床费","应付金额(元)","折扣费用","实付金额","日期"};//,"备   注"};
	
	
	for (i=0;i<rows;i++)
	{
		m_Grid.SetTextMatrix(row,i,head[i]);
		m_Grid.SetColAlignment(i,( i>1 && i<m_Grid.GetCols() - 1 ) ? 7 : 1);
	}
	m_Grid.SetColWidth(0,500);
	m_Grid.SetColWidth(1,1500);
	m_Grid.SetColWidth(2,1100);
	m_Grid.SetColWidth(3,680);
	m_Grid.SetColWidth(4,1300);
	m_Grid.SetColWidth(5,1200);
	m_Grid.SetColWidth(6,1200);
	m_Grid.SetColWidth(7,1200);

}
void CSaleView::SetEdtPos()
{
	 if (m_Grid.GetRow() == m_Grid.GetRows() - 1) return;
	 if (m_Grid.GetCol() == m_Grid.GetCols()-1) 
	 {
		 if (m_Grid.GetRow() > 1)
		 {
			 m_edt=m_Grid.GetTextMatrix(m_Grid.GetRow() - 1,m_Grid.GetCol());
			 UpdateData(FALSE);
			 m_Grid.SetTextMatrix(m_Grid.GetRow(),m_Grid.GetCol(),m_edt);
			 
		 }

	 }	 
	if (m_Grid.GetCol() == 6)
	{
		double real_fee=0.00;
		char tmp[20];
		real_fee = atof(m_Grid.GetTextMatrix(m_Grid.GetRow(),4)) - atof(m_Grid.GetTextMatrix(m_Grid.GetRow(),5));
		sprintf(tmp,"%.2f",real_fee);
		m_edt=tmp;
		UpdateData(FALSE);
		m_Grid.SetTextMatrix(m_Grid.GetRow(),6,(LPCTSTR)tmp);
		SumCol(6,m_Grid.GetRows() - 1);		
	}
	long x,y,cx,cy; 
	CRect rect;
	m_Grid.GetWindowRect(&rect);
	x= m_Grid.GetCellLeft()  / 15 + 10 ;
	y=m_Grid.GetCellTop();
	y= rect.top + m_Grid.GetCellTop()/15 - 65;
	cx=m_Grid.GetCellWidth() /15 + 1;
	cy=m_Grid.GetCellHeight() /15 + 2;
	GetDlgItem(IDC_EDT)->SetWindowPos(&wndTop,x,y,cx,cy,SWP_SHOWWINDOW);
	GetDlgItem(IDC_EDT)->SetFocus();
	GetDlgItem(IDC_EDT)->SendMessage(EM_SETLIMITTEXT,10,0);
	GetDlgItem(IDC_EDT)->SendMessage(EM_SETSEL,0,-1);
	
	//::SendMessage((HWND)GetDlgItem(IDC_EDT),WM_SETFOCUS,(HWND)GetDlgItem(IDC_EDT),0);
		
}

BEGIN_EVENTSINK_MAP(CSaleView, CFormView)
    //{{AFX_EVENTSINK_MAP(CSaleView)
	ON_EVENT(CSaleView, IDC_MSFLEXGRID1, -600 /* Click */, OnCellClick, VTS_NONE)
	ON_EVENT(CSaleView, IDC_MSFLEXGRID1, 71 /* EnterCell */, OnEnterCellMsflexgrid1, VTS_NONE)
	ON_EVENT(CSaleView, IDC_MSFLEXGRID1, 73 /* Scroll */, OnScrollMsflexgrid1, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CSaleView::OnCellClick() 
{
   if(m_Grid.GetRow()>0 || m_Grid.GetCol()>1 )
	   SetEdtPos();
 
}

void CSaleView::MoveEdt(MSG *pMsg)
{
	switch( pMsg->wParam)
	{
	case VK_LEFT:
		if(m_Grid.GetCol()>2) 
			m_Grid.SetCol(m_Grid.GetCol() - 1);
		else
		if(m_Grid.GetCol()== 2 && m_Grid.GetRow() > 1 )
		{
			m_Grid.SetRow(m_Grid.GetRow() - 1);
			m_Grid.SetCol(m_Grid.GetCols() - 1);
		}
		SetEdtPos();
		break;		
	case VK_RIGHT:
	case VK_RETURN:
	
		if(m_Grid.GetCol()< m_Grid.GetCols() - 1)
			m_Grid.SetCol(m_Grid.GetCol() + 1);
		else
		if (m_Grid.GetCol() == m_Grid.GetCols() - 1  && m_Grid.GetRow() < m_Grid.GetRows() - 2)
		{
			m_Grid.SetRow(m_Grid.GetRow() + 1);
			m_Grid.SetCol(2);
		}
		SetEdtPos();
		break;
	case VK_UP:
		if(m_Grid.GetRow() > 1)
			m_Grid.SetRow(m_Grid.GetRow() - 1);
		SetEdtPos();
		break;
	case VK_DOWN:
		if(m_Grid.GetRow() < m_Grid.GetRows() - 2)
			m_Grid.SetRow(m_Grid.GetRow() + 1 );
		SetEdtPos();
		break;
	}

}

BOOL CSaleView::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(pMsg->message == WM_KEYDOWN )
		MoveEdt(pMsg);
	return CFormView::PreTranslateMessage(pMsg);
}


void CSaleView::OnEnterCellMsflexgrid1() 
{
   m_edt.Empty();
   m_edt=m_Grid.GetText();
   UpdateData(FALSE);
}


void CSaleView::OnSelchangeHospitalComb() 
{
	UpdateData();
	m_Grid.SetRedraw(FALSE);
	m_Grid.SetRows(2);
	int cols=m_Grid.GetCols();
 	DBLibrary DB(((CPhysicMApp *)AfxGetApp())->DBSession);
	try{
		char tmp[50],pn[40];
		long id;
		CString m_id,p_id;
		m_HospitalComb.GetWindowText(m_id);
		p_id=m_id.Mid(1,3);
		DB.Open("select doctor_id did,doctor_name dn from doctor where hospital_id = %s order by doctor_id",p_id);
		memset(tmp,0,50);
		int i=1;
		while(!DB.isEof())
		{
			m_Grid.SetRows(m_Grid.GetRows()+1);
			m_Grid.SetRow(m_Grid.GetRows()-1);
			m_Grid.SetRowHeight(m_Grid.GetRows() - 1,310);
			sprintf(pn,"%03d",i);
			m_Grid.SetTextMatrix(i,0,pn);
			memset(pn,0,40);
			id=DB.GetValue("did");
			DB.GetValue("dn",pn);
			sprintf(tmp,"[%03d]%s",id,pn);
			m_Grid.SetTextMatrix(i,1,tmp);
			sprintf(tmp,"%.2f",m_dt_rate);
			for (int j=2;j<cols;j++)
				(j==3) ? m_Grid.SetTextMatrix(i,3,tmp) : m_Grid.SetTextMatrix(i,j,"");
			i++;
			DB.Next();
		}
	if (i==1) return;
	m_Grid.SetCellAlignment(4);
	m_Grid.SetTextMatrix(i,0,"合  计");
	m_Grid.SetTextMatrix(i,1,"合  计");
	m_Grid.SetMergeRow(i,TRUE);
	m_Grid.SetRedraw(TRUE);
	m_Grid.SetRow(1);
	SetEdtPos();	 
	}catch (DBErr &err)
	{
		char *str;
		int code;
		err.GetLastErr(code,&str);
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("%s(%d)",str,code);
	}
	catch (...)
	{
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("unknow err(%d)",-1);
	}

}
bool CSaleView::CheckGrid(CMSFlexGrid *pGrid)
{
	CString dt,did;
	CString num,price,sub_fee,real_fee,date,dt_rate;
	char errstr[100];

	int rt,count=0,rows=pGrid->GetRows()-1;
	try{
		for (rt=1;rt<rows;rt++)
		{
			dt=m_Grid.GetTextMatrix(rt,1);
			did=dt.Mid(1,3);
			did.TrimLeft();
			did.TrimRight();
			num=m_Grid.GetTextMatrix(rt,2);
			dt_rate=m_Grid.GetTextMatrix(rt,3);
			price=m_Grid.GetTextMatrix(rt,4);
			sub_fee=m_Grid.GetTextMatrix(rt,5);
			real_fee=m_Grid.GetTextMatrix(rt,6);
			date=m_Grid.GetTextMatrix(rt,7);
			num.TrimLeft();
			num.TrimRight();			
			if (atof(num) <= 0.00)	continue;
			
			price.TrimLeft();
			price.TrimRight();
			if (price.IsEmpty()) price="0";
			sub_fee.TrimLeft();
			sub_fee.TrimRight();
			if (sub_fee.IsEmpty()) sub_fee="0";
			date.TrimLeft();
			date.TrimRight();
			if (date.IsEmpty()) 
			{
				sprintf(errstr,"销售日期不能为空(第%d行),请输入",rt);
				throw errstr;
			}
			if(date.GetLength() != 10)
			{
				sprintf(errstr,"销售日期有误(第%d行),请检查",rt);
				throw errstr;
			}
			int year,month,day;
			year=atoi(date.Mid(0,4));
			month=atoi(date.Mid(5,2));
			day=atoi(date.Mid(8,2));
			COleDateTime dt;
			if (dt.SetDate(year,month,day) != 0) 
			{
				sprintf(errstr,"销售日期%s有误(第%d行),请更正",date,rt);
				throw errstr;
			}
			date=dt.Format("%Y-%m-%d");    
			if (did.IsEmpty()) {
				sprintf(errstr,"第%d行医生编号有误",rt);
				throw errstr;
			}
			count++;
		}
		if (count == 0) throw "没有内容需要增加";
		return TRUE;
		
	}
	catch (char *estr)
	{
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr(estr);
		return FALSE;
	}
	catch(...)
	{
		((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("unknow err(%d)",-1);
		return FALSE;
	}	

}
void CSaleView::SumCol(int col,int rows)
{
	double sum=0.00;
	for (int i=1;i< rows;i++)
		sum += atof(m_Grid.GetTextMatrix(i,col));
	char str[20];
	sprintf(str,"%.2f",sum);
    m_Grid.SetTextMatrix(rows,col,(LPCTSTR) str);
}

void CSaleView::OnChangeEdt() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CFormView::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	UpdateData();
	m_Grid.SetText(m_edt);
	char tmp[20];
	double pay_fee=0.00;
	//输入数量	
	if(m_Grid.GetCol() == 2)
	{				
		pay_fee=atof(m_Grid.GetTextMatrix(m_Grid.GetRow(),3)) * atof(m_edt);
		sprintf(tmp,"%.2f",pay_fee);
		m_Grid.SetTextMatrix(m_Grid.GetRow(),4,(LPCTSTR)tmp);
		m_Grid.SetTextMatrix(m_Grid.GetRow(),6,(LPCTSTR)tmp);
		SumCol(4,m_Grid.GetRows() - 1);
		SumCol(m_Grid.GetCol(),m_Grid.GetRows() - 1);
		SumCol(6,m_Grid.GetRows() - 1);
		return;
	}
	//临床费
	if(m_Grid.GetCol()==3)
	{
		pay_fee=atof(m_Grid.GetTextMatrix(m_Grid.GetRow(),2)) * atof(m_edt);
		sprintf(tmp,"%.2f",pay_fee);
		m_Grid.SetTextMatrix(m_Grid.GetRow(),4,(LPCTSTR)tmp);
		m_Grid.SetTextMatrix(m_Grid.GetRow(),6,(LPCTSTR)tmp);
		SumCol(4,m_Grid.GetRows() - 1);
		SumCol(6,m_Grid.GetRows() - 1);
		return;
	}

	if (m_Grid.GetCol() == 4)
	{
		double real_fee=0.00;
		real_fee = atof(m_Grid.GetTextMatrix(m_Grid.GetRow(),4)) - atof(m_Grid.GetTextMatrix(m_Grid.GetRow(),5));
		sprintf(tmp,"%.2f",real_fee);
		m_Grid.SetTextMatrix(m_Grid.GetRow(),6,(LPCTSTR)tmp);
		SumCol(6,m_Grid.GetRows() - 1);
	}
	if (m_Grid.GetCol() == 7 ) return;
	SumCol(m_Grid.GetCol(),m_Grid.GetRows() - 1);

}
CDBSession CSaleView::GetDB()
{
	return ((CPhysicMApp *)AfxGetApp())->DBSession;
}
void CSaleView::ShowErr(char *str,int code)
{
	if(((CPhysicMApp *)AfxGetApp())->pMainFrm==NULL)
	{
		MessageBox(str,"错误提示",MB_OK | MB_ICONERROR);
		return;
	}
	((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("%s(errcode:%d)",str,code);
}

void CSaleView::GetHospital()
{
	m_HospitalComb.ResetContent();
	try{
		DBLibrary DB(GetDB());
		int id=0;
		char pn[40],tmp[50];
		memset(tmp,0,50);
		memset(pn,0,40);
		DB.Open("select hospital_id hid,hospital_name hn from hospital order by hospital_id");
		memset(tmp,0,50);
		memset(pn,0,40);
		while(!DB.isEof())
		{
			id=DB.GetValue("hid");
			DB.GetValue("hn",pn);
			sprintf(tmp,"[%03d]%s",id,pn);
			m_HospitalComb.AddString(tmp);
			DB.Next();
		}
	}catch (DBErr &err)
	{
		char *str;
		int code;
		err.GetLastErr(code,&str);
		//((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("%s(%d)",str,code);
		ShowErr(str,code);
	}
	catch (...)
	{
		ShowErr("unknow error",-1);
		//((CPhysicMApp *)AfxGetApp())->pMainFrm->AddErr("unknow err(%d)",-1);
	}
}

void CSaleView::OnScrollMsflexgrid1() 
{
	GetDlgItem(IDC_EDT)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_DEDIT)->SetFocus();
}